package com.example.ecommercemarketing.controller;

import com.example.ecommercemarketing.dto.MarketingElementsDTO;
import com.example.ecommercemarketing.dto.ProductDTO;
import com.example.ecommercemarketing.dto.UserDTO;
import com.example.ecommercemarketing.enums.ProductCategory;
import com.example.ecommercemarketing.helper.MarketingHelper;
import com.example.ecommercemarketing.service.MarketingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;
import java.util.concurrent.*;

/**
 * 营销活动控制器
 *
 * <p>提供营销素材相关的RESTful API接口</p>
 * <p>主要功能：</p>
 * <ul>
 *   <li>按商品分类获取营销素材</li>
 *   <li>获取所有商品分类的营销素材（支持串行和并行两种方式）</li>
 * </ul>
 * <p>访问路径前缀：/api/marketing</p>
 */
@RestController
@RequestMapping("/api/marketing")
public class MarketingController {

    /**
     * 营销辅助工具类，用于生成模拟数据等辅助功能
     */
    private final MarketingHelper marketingHelper;

    /**
     * 营销服务类，核心业务逻辑处理
     */
    private final MarketingService marketingService;

    /**
     * 构造函数，Spring会自动注入依赖
     * @param marketingHelper 营销辅助工具类实例
     * @param marketingService 营销服务类实例
     */
    @Autowired
    public MarketingController(
            MarketingHelper marketingHelper,
            MarketingService marketingService) {
        this.marketingHelper = marketingHelper;
        this.marketingService = marketingService;
    }

    /**
     * 获取指定商品大类的营销素材
     * <p>
     * URL示例：http://localhost:8080/api/marketing/elements/electronics
     *
     * @param category 商品大类编码，路径变量
     * @param user 用户信息
     * @return 营销素材列表
     */
    @GetMapping("/elements/{category}")
    public List<MarketingElementsDTO> getMarketingElements(
            @PathVariable String category,
            @RequestBody UserDTO user) {

        // 根据分类编码获取对应的枚举值
        ProductCategory productCategory = ProductCategory.getCategoryByCode(category);

        // 生成模拟商品列表（实际项目是从数据库+推荐系统获取）
        List<ProductDTO> products = marketingHelper.generateProductList(productCategory);

        // 调用服务层获取营销素材
        return marketingService.getMarketingElements(productCategory, products, user);
    }

    /**
     * 获取所有商品大类的营销素材（旧版串行实现）
     * <p>
     * URL示例：http://localhost:8080/api/marketing/elements/allold
     *
     * @deprecated 已废弃，请使用并行版本的/elements/all接口
     *
     * @param user 用户信息
     * @return 按商品大类编码分组的营销素材Map
     */
    @Deprecated
    @GetMapping("/elements/allold")
    public Map<String, List<MarketingElementsDTO>> getAllMarketingElementsOld(
            @RequestBody UserDTO user) {

        // 调用辅助类的旧版串行实现方法
        return marketingHelper.getAllMarketingElementsHelpOld(user);
    }

    /**
     * 并行获取所有商品大类的营销素材（新版实现）
     * <p>
     * URL示例：http://localhost:8080/api/marketing/elements/all
     *
     * @param user 用户信息
     * @return CompletableFuture包装的营销素材Map，Spring会自动处理异步响应
     */
    @GetMapping("/elements/all")
    public CompletableFuture<Map<String, List<MarketingElementsDTO>>> getAllMarketingElements(
            @RequestBody UserDTO user) {

        // 调用辅助类的并行实现方法，返回异步结果
        return marketingHelper.getAllMarketingElementsFuture(user);
    }
}